#-*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
# Number：     014
# Name:        Python pass by value（传值）
# Author:      SUMMVING
# Email:       summving@gmail.com
# Created:     2013/08/16  21:22
# Copyright:   (c) SUMMVING 2013
# Licence:     GPLv3
#-------------------------------------------------------------------------------

def f(x):
    print x
f(10)                     #传递一个数字
f('hello')                #传递字符串
f([1,2,3,4])              #传递一个列表
f(range(10))              #传递用range生成的列表

l = range(5)
f(l)                      #把列表l传递给函数f()

f(('a','b'))              #传递元组。不能写成f('a','b'),因为f()定义的是一个形参，这里传递了两个
f({'a':11,2:33,3:'b'})    #传递字典

#--------
def f1(x,y):              #定义一个有两个参数的函数
    print "%s : %s" % (x,y)     #打印两个字符串，其值是由后面的x,y向前传递， % 为传递符

f1('a','b')                     #直接传递数值
t = ('i am ','summving')        #定义一个元组，因为f1()只有2个参数，所以该元组只能有两个元素
f1(*t)                          #传递一个元组，若不要 * 就会报错

#--------
def f2(name = "name",age = 0):  #定义默认参数值
    print "name : %s" % name    #传值
    print "age  : %s" % age

f2("summving",22)               #指定参数传值，等效于 f2(name="summving",age=22):用这种方式时age，name的位置可互换
f2()                            #输出默认值

#------
t = (22,"summving")
f2(*t)                          #输出name ：22，age ：summving，并没有自动识别类型
                                #没有 * 则报错，因为 t 是元组

#------
u = {'age':22,'name':"summving"}
f2(u)                           #无 * 时，输出为 name : {'age': 22, 'name': 'summving'}，age  : 0
f2(*u)                          #有 * 时，输出为 name ：age ，age = name
f2(**u)                         #当 ** 时，输出正常

u['age'] = 21                   #直接修改字典里面的数据，
f2(**u)

""" 处理多余实参"""
def f3(x,*args):                #args是随便定义的，arg：（函数的）自变量
    print x
    print args                  #除了x以外的元素组成一个元组

f3(11)                          #输出:11，()
f3(x=22)                        #输出:22，();若是f3(x=2,y=4)时会报错
f3(1,2,3)                       #输出:1，(2,3)

def f3(x,*arg1,**arg2):
    print  x
    print arg1
    print arg2

f3(1)                           #输出1，()，{}
f3(1,2,3,4)                     #输出1，(2,3,4)，{}
f3(x=11,y=22)                   #输出11，()，{'y':22}
f3(1,2,3,4,x1=5,y=6)            #输出1，(2,3,4),{'x1':5,'y':6},此处不能把x1改为x，因为函数定义有x

